package jp.dodododo.dao.sql.node;

import java.lang.reflect.Array;
import java.util.List;

import jp.dodododo.dao.context.CommandContext;
import jp.dodododo.dao.util.OgnlUtil;

public class ParenBindVariableNode extends AbstractNode {

	private String expression;

	private Object parsedExpression;

	public ParenBindVariableNode(String expression) {
		this.expression = expression;
		this.parsedExpression = OgnlUtil.parseExpression(expression);
	}

	public String getExpression() {
		return expression;
	}

	public void accept(CommandContext ctx) {
		Object var = OgnlUtil.getValue(parsedExpression, ctx);
		if (var == null) {
			return;
		} else if (var instanceof List) {
			bindArray(ctx, ((List<?>) var).toArray());
		} else {
			Class<?> clazz = var.getClass();
			if (clazz.isArray()) {
				bindArray(ctx, var);
			} else {
				int type = getType(clazz);
				ctx.addSql("?", var, type);
			}
		}

	}

	private void bindArray(CommandContext ctx, Object array) {
		int length = Array.getLength(array);
		if (length == 0) {
			return;
		}
		Class<?> clazz = null;
		for (int i = 0; i < length; ++i) {
			Object o = Array.get(array, i);
			if (o != null) {
				clazz = o.getClass();
			}
		}
		ctx.addSql("(");
		int type = getType(clazz);
		ctx.addSql("?", Array.get(array, 0), type);
		for (int i = 1; i < length; ++i) {
			ctx.addSql(", ?", Array.get(array, i), type);
		}
		ctx.addSql(")");
	}
}